package com.sy.controller.user;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sy.constant.PayConstant;
import com.sy.dto.PayDTO;
import com.sy.pojo.CourseUser;
import com.sy.pojo.Orders;
import com.sy.result.Result;
import com.sy.service.AliPayService;
import com.sy.service.CourseUserService;
import com.sy.service.OrdersService;
import com.sy.utils.IdWorker;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Map;

@Slf4j
@RestController("userPayController")
@RequestMapping("/user/pay")
public class PayController {


    @Autowired
    private AliPayService aliPayService;
    @Autowired
    private OrdersService ordersService;
    @Autowired
    private CourseUserService courseUserService;

    /**
     * 生成二维码
     * @return
     */
    @ApiOperation("生成二维码")
    @PostMapping("/createNative")
    public Result<Map> createNative(@RequestBody PayDTO payDTO) {
        try {
            log.info("获取二维码， 并获取预下单信息：{}", payDTO);
            // 支付之前先进行预下单
            // 创建订单对象
            Orders orders = new Orders();
            // 设置课程id
            orders.setCourseId(payDTO.getCourseId());
            // 设置金额
            orders.setAmount(payDTO.getAmount());
            // 参数1: 订单号   参数2:5.5支付金额
            IdWorker idworker = new IdWorker();
            orders.setNumber(idworker.nextId() + "");
            Map map = aliPayService.createNative(orders, payDTO.getCourseName());
            if (map.get("code") == "1") {
                return Result.success(map);
            } else {
                return Result.error("下单异常...");
            }
        } catch (Exception e) {
            return Result.error("下单异常...");
        }
    }
    /**
     * 查询支付状态
     * @param out_trade_no
     * @return
     */
    @GetMapping("/queryPayStatus")
    @Transactional
    public Result queryPayStatus(String out_trade_no) {
        System.out.println("查询交易状态。。。。。" + out_trade_no);
        Result result = null;
        int x = 0;
        while (true) {
            //调用查询接口
            Map<String, String> map = null;
            try {
                map = aliPayService.queryPayStatus(out_trade_no);
            } catch (Exception e1) {
                /*e1.printStackTrace();*/
                System.out.println("调用查询服务出错");
                result = Result.error("支付异常，请重新支付");
                break;
            }
            //出错
            if (map == null) {
                result = Result.error("支付出错");
                break;
            }
            //如果成功
            if (map.get("tradestatus") != null && map.get("tradestatus").equals("TRADE_SUCCESS")) {
                result = Result.success("支付成功");
                // 需要把订单中生成的预下单的信息修改（修改支付时间， 订单状态）
                LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
                queryWrapper.eq(Orders::getNumber, out_trade_no);
                // 先要通过订单编号查询订单信息
                Orders orders = ordersService.getOne(queryWrapper);
                // 设置支付时间
                orders.setCheckoutTime(LocalDateTime.now());
                // 设置订单状态
                orders.setPayStatus(PayConstant.PAY_SUCCESS);
                // 修改订单信息
                ordersService.updateById(orders);


                //再实现保存操作（当前用户购买了当前课程）
                CourseUser courseUser = new CourseUser();
                courseUser.setCid(orders.getCourseId());
                courseUser.setUid(orders.getUserId());
                courseUserService.save(courseUser);
                break;
            }
            //未付款交易超时关闭，或支付完成后全额退款
            if (map.get("tradestatus") != null && map.get("tradestatus").equals("TRADE_CLOSED")) {
                result = Result.success("未付款交易超时关闭，或支付完成后全额退款");
                break;
            }
            //交易结束，不可退款
            if (map.get("tradestatus") != null && map.get("tradestatus").equals("TRADE_FINISHED")) {
                result = Result.success("交易结束，不可退款");
                break;
            }
            try {
                //间隔三秒
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //为了不让循环无休止地运行，我们定义一个循环变量，如果这个变量超过了这个值则退出循环，设置时间为5分钟
            x++;
            if (x >= 5000) {
                result = Result.error("二维码超时");
                break;
            }
        }
        return result;
    }
}